/*
 * @Author: Wangjun
 * @Date: 2023-08-03 09:51:03
 * @LastEditTime: 2023-10-13 11:20:13
 * @LastEditors: Wangjun
 * @Description:
 * @FilePath: \nodex\nodetime\op_osp.go
 * hnxr
 */
package nodetime

import (
	"gitee.com/hnxr_1/nodex"
)

func init() {
	nodex.Reister(new(Osp))
}

// Osp 延时接通
type Osp struct {
	nodex.Node
	X nodex.Boolean `remark:"输入X"`
	T nodex.Double  `remark:"延时时间(秒)"`
	W int64         //剩余时间
	Y nodex.Boolean `remark:"输出Y,,out"`
}

func (m *Osp) GetModelID() int {
	return nodex.ModTimer
}

/**
 * @description:
 * @param {*nodex.Memory} mem 上一次缓存的结果
 * @return {*}
 */
func (m *Osp) Init(mem *nodex.Memory) (err error) {
	m.UID = m.MakeUID()
	m.Ptr = &m.W

	if mem == nil {
		return
	}
	if mem.UID != m.UID {
		return
	}
	m.W = nodex.GetNumber[int64](mem.Ptr)
	return
}

/**
 * @description:
 * @return {*}
 */
func (m *Osp) GetName() string {
	return "OSP"
}

/**
 * @description: 注册数据
 * @return {*}
 */
func (m *Osp) RegData() []byte {
	return nodex.MakeRegData(m, "接通固定脉冲", m.GetName(), "")
}

func (m *Osp) Calc() (err error) {
	if m.EnQ {
		if *m.X.Bad {
			m.Bad = true
			return //不计算
		}
	}

	m.Bad = false

	now := Now()
	if m.X.Value {
		if m.W == 0 {
			m.W = now
		}
	}

	if m.W > 0 {
		//只有满足条件后才能复位
		if now-m.W > int64(m.T.Value) {
			m.Y.Value = false
			if !(m.X.Value) {
				m.W = 0
			}
		} else {
			m.Y.Value = true
		}
	}

	return
}
